'''
Author: HowsenFisher
Date: 2021-04-07 22:47:47
LastEditTime: 2021-04-14 19:23:58
LastEditors: liutq
Description: 这是文件比较模块
FilePath: \子网传输\FileTools\FolderCompare.py
'''
import os
from sql.AdminDB import *
from FileTools.FileStat import *


class FolderCompare:
    '''
        @description: 文件夹比较类，用于在同步前比较本地share文件夹和数据库最新记录的区别
        @param {*} self
        @param {*} parent：父对象，用于递交GUI信号
        @param {*} myshare：我的共享文件夹路径
    '''

    def __init__(self, parent, myshare):
        # 父对象
        self.parent = parent
        # 打开log文件
        self.logfile = open("./SyncLogs/log.txt", 'w', encoding='utf-8')
        # 向GUI递交信息
        # self.parent.newInfoSignal.emit("读取本地共享目录")
        # 获取本地共享文件夹文件列表
        myshareList = self.walk_my_share(myshare)
        # 向GUI递交信息
        # self.parent.newInfoSignal.emit("读取数据库最新目录")
        # 从数据库获取最新文件列表
        newestList = getAllFiles()
        # 向GUI递交信息
        # self.parent.PrintInfo("生成文件同步脚本")
        # 生成同步脚本，保存在log中
        self.generateSyncInfo(myshareList, newestList)
        # 向GUI递交信息
        # self.parent.PrintInfo("文件同步脚本生成完毕")
        # 文件关闭，必须有，否则会有意想不到的错误
        self.logfile.close()

    '''
    @description: 遍历我的共享文件夹
    @param {*} self
    @param {*} path：文件夹路径
    @return {*}：文件列表
    '''

    def walk_my_share(self, path):
        res = []
        for root, dirs, files in os.walk(path):
            # root 表示当前正在访问的文件夹路径
            # dirs 表示该文件夹下的子目录名list
            # files 表示该文件夹下的文件list
            # 遍历文件
            for f in files:
                res.append(os.path.join(root, f))
            # 遍历所有的文件夹
            for d in dirs:
                res.append(os.path.join(root, d))
        return res

    '''
    @description: 生成同步脚本
    @param {*} self
    @param {*} myshareList：共享文件夹文件列表
    @param {*} newestList：数据库最新文件列表
    @return {*}：一个log文件
    '''

    def generateSyncInfo(self, myshareList, newestList):
        # 先对json数据处理一波，换成相对路径
        for index, item in enumerate(myshareList):
            myshareList[index] = "/".join(myshareList[index].split("\\")[1:])
        for index, item in enumerate(newestList):
            newestList[index]['filepath'] = "/".join(
                newestList[index]['filepath'].split("\\")[1:])
        print(myshareList)
        print(newestList)

        # 如果本地共享文件夹为空
        if not myshareList:
            # 直接遍历数据库最新信息，形成拉取pull命令或者mkdir新建文件夹命令
            for item in newestList:
                if item['type'] == 'dir':
                    print("mkdir %s/%s" %
                          (conf.share_dir, item['filepath']), file=self.logfile)
                else:
                    print("pull %s from %s" %
                          (item['filepath'], item['Owner']), file=self.logfile)
            return

        # 遍历数据库最新信息
        for newestfile in newestList:
            # 遍历本地文件信息
            for index, myfilepath in enumerate(myshareList):
                # 如果相同文件路径
                if newestfile['filepath'] == myfilepath:
                    # 比较修改时间
                    myfile_time = str(FileStat(conf.share_dir+"/"+myfilepath).getStat()['最后一次修改时间'])
                    newfile_time = newestfile['ConfigTime']
                    print(myfile_time,newfile_time)
                    if myfile_time >= newfile_time:
                        # 本地修改时间更新则跳过,遍历下一个最新文件
                        break
                    else:
                        # 否则更新文件，生成拉取pull命令或者mkdir新建文件夹命令
                        if newestfile['type'] == "dir":
                            pass
                        else:
                            print("pull %s from %s" % (myfilepath,
                                  newestfile['Owner']), file=self.logfile)
                        break

                # 如果不是相同文件,继续向下遍历
                else:
                    # 如果本地文件到头了，证明没有相同的文件
                    if index == len(myshareList)-1:
                        # 根据文件类型生成拉取pull命令或者mkdir新建文件夹命令
                        if newestfile['type'] == "dir":
                            print("mkdir %s/%s" % (conf.share_dir,
                                  newestfile['filepath']), file=self.logfile)

                        else:

                            print("pull %s from %s" % (
                                newestfile['filepath'], newestfile['Owner']), file=self.logfile)
                    else:
                        continue
        
        # 遍历本地文件
        for myfile in myshareList:
            # 如果本地文件不在数据库最新记录中，形成删除命令
            if not myfile in [i['filepath'] for i in newestList]:
                print("delete %s/%s" %
                      (conf.share_dir, myfile), file=self.logfile)
